package org.yi.fc.entity;

import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Model;

/**
 * 用户角色对应关系实体
 * @author ilgql
 *
 */
public class FUserRole extends Model<FUserRole> {
	
	private static final long serialVersionUID = -3987606457592671023L;
	
	private Logger logger = LoggerFactory.getLogger(getClass());
	
	public static FUserRole dao = new FUserRole();
	
	/**
	 * 根据用户id查询用户所拥有的用户角色对应关系列表
	 * @param userId					用户id
	 * @return							List<FUserRoles>
	 */
	public List<FUserRole> getUserRoles(int userId){
		String sql = "select * from f_user_role where user_id = ?";
		return find(sql,userId);
	}
	
	/**
	 * 根据用户id查询用户所拥有的用户角色对应关系
	 * @param userId					用户id
	 * @return							List<FUserRoles>
	 */
	public FUserRole getUserRoles(int userId, int roleId){
		String sql = "select * from f_user_role where user_id = ? and role_id = ?";
		return findFirst(sql,userId, roleId);
	}
	
	/**
	 * 根据用户id查询用户所拥有的所有角色列表
	 * @param userId					用户id
	 * @return							List<FRole>
	 */
	public List<FRole> getRoles(int userId){
		StringBuffer sb = new StringBuffer("select * from f_role where id in (  select role_id from f_user_role where user_id = ? )");
		List<FRole> list = Db.query(sb.toString(), userId);
		return list;
	}
	
	/**
	 *  根据用户id查询用户所拥有的所有角色的名称列表
	 * @param userId					用户id
	 * @return							List<String>
	 */
	public List<String> getRoleNames(long userId){
		StringBuffer sb = new StringBuffer("select role_name from f_role where id in (  select role_id from f_user_role where user_id = ? )");
		List<String> list = Db.query(sb.toString(), userId);
		return list;
	}
	
	/**
	 * 授予用户某个角色的权限
	 * @param userId					用户id
	 * @param roleId					角色id
	 * @return  						boolean
	 */
	public boolean grantRole(int userId, int roleId){
		
		logger.debug("call  grantRole(int userId, int roleId), 【userId={},roleId={}】", userId, roleId);
		
		FSysUser user = FSysUser.dao.findById(userId);
		FRole role = FRole.dao.findById(roleId);
		
		if(user == null){
			logger.error("授予用户某个角色的权限时，根据userId={}无法获取用户信息", userId);
			return false;
		}
		
		if(role == null){
			logger.error("授予用户某个角色的权限时，根据roleId={}无法获取角色信息", roleId);
			return false;
		}
		
		boolean result = false;
		try{
			result = new FUserRole()
				.set("user_id", userId)
				.set("role_id", roleId)
				.set("crate_user_id", userId)
				.set("create_time", new Date())
				.save();
		}catch(Exception e){
			logger.error("授予用户【userId={}】角色id为【roleId={}】的权限失败:" , e);
		}
		
		return result;
	}
	
	/**
	 * 取消用户的角色权限
	 * @param userId			用户id
	 * @param roleId			角色id
	 * @return					boolean
	 */
	public boolean cacleGrant(int userId, int roleId){
		boolean result = false;
		FUserRole userRoles = getUserRoles(userId, roleId);
		
		if(userRoles == null){
			logger.error("取消用户id为{},角色id为{}的用户角色对应关系失败，失败原因：根据用户id和角色id无法获取【用户角色关系实体】", userId, roleId);
		}else{
			try{
				result = userRoles.delete();
			}catch(Exception e){
				logger.error("取消用户id为{},角色id为{}的用户角色对应关系失败，失败原因：",  userId, roleId, e);
			}
		}
		
		return result;
	}
	
}
